#!/bin/sh
##!/bin/csh
##!/etc/perl
#直接使用tcsh scripts可执行脚本

#shell脚本，替换人做些重复的命令操作时使用

#使用命令行替换变量
str='this is '`pwd`
echo $str

#count=10
#echo count is $count
#echo home:$HOME
#echo path:$PATH
#echo tz:$TZ		#时区
#echo mailcheck:$MAILCHECK   #邮件检查
#echo ps1:$PS1  #外壳命令行的提示符
#echo ps2:$PS2 

#以下几个$开头的，用于执行外壳程序时，系统设置好的
#$#  #存储外壳程序中命令行的个数
#$?	#存储上一个执行程序的返回值
#$0	#存储外壳程序的程序名
#$*	#存储所有命令行的所有参数
#$@	#存储所有命令行输入的参数
#$$	#存储外壳程序的PID
#$!	#存储上一个后台执行命令的PID

#test命令用来测试条件表达式
#1.整数运算
#test int1 -eq int2   #int1==int2，返回真
#test int1 -ge int2	  #int1 >= int2, 返回真
#test int1 -gt int2	  #int1 > int2, 返回真
#test int1 -le int2	  #int1 <= int2, 返回真
#test int1 -lt int2	  #int1 < int2, 返回真	
#test int1 -ne int2	  #int1 != int2, 返回真	
#2.字符串运算
#test str1 = str2	#如果str1与str2相同，返回真
#test str1 != str2	#如果str1与str2不相同，返回真 
#test str			#如果str不为空，返回真
#test -n str		#如果strlen(str)>0，返回真
#test -z str		#如果strlen(str)==0，返回真
#3.文件运算符
#test -d filename	#如果filename为目录，返回真
#test -f filename	#如果filename为普通文件，返回真
#test -s filename	#如果filename长度大于0，返回真
#test -r filename	#如果filename可读，返回真
#test -w filename	#如果filename可写，返回真
#test -x filename	#如果filename可执行，返回真
#4.逻辑运算符
#test !expr 	#如果expr为假，返回真
#test expr1 -a expr2   #如果expr1和expr2同为真，返回真
#test expr1 -o expr2   #如果expr1和expr2有一个为真，返回真

#csh没有test,同样支持表达式，大多用在if和while命令中
#1.整数运算符
#int1 <= int2		
#int1 >= int2
#int1 > int2
#int1 < int2
#2.字符串运算符
#str1 == str2
#str1 != str2
#3.文件运算符
#-r file		#如果file可读，返回真
#-w file		#如果file可写，返回真
#-x file		#如果file可执行，返回真
#-e file		#如果file存在，返回真
#-o file		#如果当前用户拥有file，返回真
#-z file		#如果file长度为0，返回真
#-f file		#如果file为普通文件，返回真
#-d file		#如果file目录，返回真
#4.逻辑运算符
#exp1 || exp2	#如果exp1或exp2为真，返回真
#exp1 && exp2	#如果exp1与exp2同时为真，返回真
#!exp			#如果exp为假，返回真


#echo -e "\t\t hello world"				##-e选项可以无限制的使用转义序列控制输出结果
#echo -n "hello kitty\n"					## -n选项 不能输出换行符
#echo 
#printf "this is %s|%d|%f|%x\n" "notepad" 100 99.99 0xff   ##printf同c的用法相同,各值间以空格区分
#expr 10+5
#expr 2\*\(3+4\)

#单引号(''), 双引号(""),反斜杠(\)
uname="hello world"
echo *     #显示当前目录下所有文件	
echo $(uname)    #uname 被解析成命令
echo '$uname'	 #uname 识别为字符串  ‘’内的内容保持不变，单引号能力最强
echo "$uname"	 #uname 会被变量替换，双引号能力最弱
echo `uname`	 #uname解析成命令，此处不是单引号，是重点号
echo \uname 	#\与单引号一样，使用进行转义，\只能转义一个字符

#bash中if如下：
#if [expression1]
#then
#commands
#elif [expression2]
#then
#commands
#else
#commands
#fi

#csh中if如下：
#if(expression1) then
#commands
#else if(expression2) then
#commands
#else
#commands 
#endif

if [ -f profile ]  #[两端要有空格]
then
echo "there is a profile "
else
echo "can't find profile"
fi

#if list; then list; [ elif list; then list;] fi   ##同行语句音加“;”, 换行可不加
if [ -e test.c ]; then 
	echo 'this is no file exist'
elif [ -e testings.sh ]; then 
	echo 'this is shell'
fi

#if(($#!=2)); then     ##等同于[$# -ne 2] 在fc13中都能解析[]和()两种形式
#	echo "usage :$0 arg1 arg2" 1>&2
#	exit
#fi

#if [ "$name" = "" ]
#then
#	echo "name is null"
#fi

#bash中case形式
#case string in
#str1)
#commands;;
#str2)			
#commands;;			
#*)				#*号是缺省的case条件
#commands;;		#直到两个;;执行
#esac

#tcsh中case形式
#switch(string1)
#case str1:
#statements
#breaksw
#case str2:
#statements
#breaksw
#default:
#statements
#breaksw
#endsw	

case $1 in 
-i)
count='grep ^i $2 | wc -l'
echo "The number of line in $2 that start with an i is $count" 
;;
-e)
count='grep ^e $2 |wc -l'
echo "The number of line in $2 that start with an i is $count"
;;
*)
echo "That option is not recongnized"
;;
esac

#命令行的参数，可以在此显示
echo $2 $1

#bash中的for语句
#for var1 in list
#do 
#command 
#done

#for var1 in $@	
#do 
#statement
#done

#tcsh中for叫做foreach,形式如下
#foreach name(list)
#commands
#end

#for var in str1, str2, str3... ; do list; done   #单行使用;隔开
#for file in *.txt; do
#	cat ${file}
	#print3 ${file}
#done

#for((i=1;i<=10;i++));do
#	echo $(expr $i\*4);
#done

#for i in $(seq 10); do
#	echo $(expr $i\*4);
#done

#for 常用格式 以下：
#for i in 'ls'
#for i in ${arr[@]}
#for i in $*; do
#for file in /path/;do
#for i in f1,f2, f3; do
#for i in *.txt;do
#for i in $(ls *.txt); do

#for in语句自动对字符串按空格遍历的特性，对多个目录遍历
#for i in {1..10}
#for i in stringchar{1..10}

#objname=test1.o test2.o test3.o
#for cname in *.c
#do					##for 变量用$var  或 ${var}
#	echo "GCC -C ${cname}"      			
#done

#for i in ./*.sh ; do     ##执行当前目录下的所有脚本文件，可用于启动系统使用
#    if [ -r "$i" ]; then		##【-r】 文件存在，并可读
#         . $i				##相当于source *.sh
#    fi
#done
#read answer					##等待从终端输入，直到回车为止。
#echo $answer

#bash中while的形式如下：
#while expression	
#do 
#statements
#done

#tcsh中while的形式如下：
#while(expression)
#stataments
#end

count=1
while [ -n "$*" ]
do
echo "This is parameter $count  $1"
shift			#将命令行参数左移一个
count='expr $count + 1'
done

#read one two three
#echo "one=$one, two=$two, three=$three"
#read -p "Enter your name:"
#echo $rely

#删除系统信号量
#echo "deleting sem"
#filename=del.txt
#touch $filename
#ipcs -s | awk '{print $2}' | grep '[0-9].*' > $filename
#for i in $(cat $filename)
#do
#	ipcrm -s $i
#done
#rm -rf $filename
#echo "deleted sem"
#	for sub in $(SUBDIR);do echo $$sub; echo "building ";done	#makefile里取shell变量使用$$

#shell函数形式,bash和pdksh中形式如下： tcsh不支持函数
fname()
{
shell commands
}
#使用函数时，使用以下方法：
fname [parm1 parm2 parm3]


#位置变量，$1,$2,1代表第一个变量，2代表第2个变量
print3()
{
	echo $1 $2 $3
}
print3 embeded linux program


#touch list.txt
#ls -hF --show-control-chars | grep / > list.txt			
#for line in $(cat list.txt);do echo $line; done
#for line in $(cat list.txt);do make -C $line; done		#用于makfile进行子目录进行编译

#进度条
#b='' 
#for ((i=0;$i<=100;i+=2)) 
#do 
#printf "progress: [%-50s] %d%%\r" $b $i 
#sleep 0.1 
#b+='#' 
#done 

#touch list.txt
#统计文件行数
#wc -l file
#ls -hF --show-control-chars | grep / > list.txt			
#for line in $(cat list.txt);do echo $line; done
#for line in $(cat list.txt);do make -C $line; done		#用于makfile进行子目录进行编译

#查找可执行文件
#find ./ -name |file * |grep -i "executable" | awk '{print $1}'
#ls |file * |grep -i "executable" | awk '{print %1}'

#把指定列数据赋给变量
variable='awk '{print $n}' filename'

#使用字符1前面的重音符，对变量使得命令进行赋值
dir=`pwd`
echo $dir

touch list
ls -hF --show-control-chars | grep / > list
#for subdir in $(cat list); do \
#mv ($$subdir/src/*) $(pwd)/src \ 
#done

hi="hello world `pwd`"
echo $hi

#向设备串口写数据
#echo "AT+CRLP=?;\n" > /dev/ttyUSB1
#从设备串口读数据
#cat < /dev/ttyUSB1

#shell中的延时函数
# sleep 1s #表示延迟一秒
# sleep 1m #表示延迟一分钟
# sleep 1h #表示延迟一小时
# sleep 1d #表示延迟一天

#查看22号端口的用处
#lsof -i:22
#stty 

#shell十六进制转十进制，0开头为8进制，0x开头为十六进制
echo $((0x1a))

#使用\x可以进行十六进制转义
echo -e \x30
#使用$符，可以相当于echo -e
echo $'\n'


















